package com.hdd.utils;

import lombok.extern.slf4j.Slf4j;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 日期工具
 */
@Slf4j
public final class DateUtil {

    /** 月份，下标就是在Calendar中的值 */
    public static final String[] MONTH_ARRAY = { "JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", "JULY", "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER" };

    public static final String DATE_PATTERN = "yyyy-MM-dd";

    public static final String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";

    public static final String TIME_BCD_PATTTERN = "yyMMddHHmmss";

    /*** 得到 yyyy-MM-dd HH:mm:ss 格式的字符串 ***/
    public static String datetimeToString(Date date) {
        return new SimpleDateFormat(DATE_TIME_PATTERN).format(date);
    }

    /*** 得到 yyyy-MM-dd 格式的字符串 ***/
    public static String dateToString(Date date) {
        return new SimpleDateFormat(DATE_PATTERN).format(date);
    }

    /** 日期转化为指定格式的字符串 */
    public static String format(Date date, String pattern) {
        DateFormat df = new SimpleDateFormat(pattern);
        return df.format(date);
    }

    /**
     * 日期字符串转化为date对象
     * @param dateStr 日期字符串
     * @param pattern 转化使用的日期格式
     * @return 返回转化的日期对象(转化失败则返回null)
     * @author chensh
     */
    public static Date parseDate(String dateStr, String pattern) {
        DateFormat f = new SimpleDateFormat(pattern);
        Date result = null;
        try {
            result = f.parse(dateStr);
        } catch (ParseException e) {
            log.error("转换日期发生异常", e);
        }
        return result;
    }

    /** 获取当前日期的字符串形式 **/
    public static String getNowTimeStr() {
        Date now = new Date();
        return new SimpleDateFormat(DATE_TIME_PATTERN).format(now);
    }

    /**
     * 给指定日期增加指定天数
     * @param date 要操作的日期
     * @param day 增加的天数(负数代表减少的天数)
     * @return 新的日期
     */
    public static Date dayAdd(Date date, int days) {
        return hourAdd(date, days * 24);
    }

    /**
     * 给指定日期增加指定小时数
     * @param date 要操作的日期
     * @param day 增加的小时数(负数代表减少的小时数)
     * @return 新的日期
     */
    public static Date hourAdd(Date date, int hours) {
        return minuteAdd(date, hours * 60);
    }

    /**
     * 给指定日期增加指定分钟数
     * @param date 要操作的日期
     * @param day 增加的分钟数(负数代表减少的分钟数)
     * @return 新的日期
     */
    public static Date minuteAdd(Date date, int minutes) {
        return secondAdd(date, minutes * 60);
    }

    /**
     * 给指定日期增加指定秒数
     * @param date 要操作的日期
     * @param day 增加的秒数(负数代表减少的秒数)
     * @return 新的日期
     */
    public static Date secondAdd(Date date, int seconds) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.SECOND, seconds);
        return cal.getTime();
    }

    /**
     * 计算两个日期之间相差的毫秒数
     * @param date 日期
     * @param anotherDate 另一个日期
     * @return 相差的毫秒数(正整数)
     */
    public static long millSecondDif(Date date, Date anotherDate) {
        long time = date.getTime();
        long time2 = anotherDate.getTime();
        long result = time2 - time;
        return Math.abs(result);
    }

    /**
     * 计算两个日期之间相差的秒数
     * @param date 日期
     * @param anotherDate 另一个日期
     * @return 相差的秒数
     */
    public static long secondDif(Date date, Date anotherDate) {
        long millSecondDif = millSecondDif(date, anotherDate);
        return millSecondDif / 1000;
    }

    /**
     * 计算两个日期之间相差的分钟数
     * @param date 日期
     * @param anotherDate 另一个日期
     * @return 相差的分钟数
     */
    public static long minuteDif(Date date, Date anotherDate) {
        long secondDif = secondDif(date, anotherDate);
        return secondDif / 60;
    }

    /**
     * 计算两个日期之间相差的小时数
     * @param date 日期
     * @param anotherDate 另一个日期
     * @return 相差的小时数
     */
    public static long hourDif(Date date, Date anotherDate) {
        long minuteDif = minuteDif(date, anotherDate);
        return minuteDif / 60;
    }

    /**
     * 计算两个日期之间相差的天数
     * @param date 日期
     * @param anotherDate 另一个日期
     * @return 相差的天数
     */
    public static long dayDif(Date date, Date anotherDate) {
        long hourDif = hourDif(date, anotherDate);
        return hourDif / 24;
    }

    /**
     * 禁止实例化工具类
     */
    private DateUtil() {

    }

}